package com.kobeliu.entity;

/**
 * @Author: Kobe_Liu
 * @Date: 2021/12/3 10:20
 */

import java.util.Arrays;

/**
 * 一个整型数组 nums 里除两个数字之外，其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)，空间复杂度是O(1)。
 * 示例 1：
 *
 * 输入：nums = [4,1,4,6]
 * 输出：[1,6] 或 [6,1]
 *
 * 示例 2：
 *
 * 输入：nums = [1,2,10,4,1,4,3,3]
 * 输出：[2,10] 或 [10,2]
 *
 */
public class Demo_64_sword_56_1 {

    public static void main(String[] args) {

        int[] nums = new int[]{4,5,2,5,2,4,7,7,1,3};

        System.out.println(Arrays.toString(singleNumbers(nums)));
    }

    public static int[] singleNumbers(int[] nums) {
        //先进行异或操作，同样的数会去掉
        int len = nums.length;
        int sum = 0;
        for (int i = 0; i < len; i++) {
            sum ^= nums[i];
        }
        //此时剩下的是两个不同值的异或
        //找到最右边的1
        //牛批啊 想不到
        int rightone = sum & (~sum+1);
        int one = 0;
        for(int num:nums){
            if((num&rightone)!=0){
//                one = num;
                //那个不一样的值，一定这一位是1，那我做异或，这一位最后剩下的一定是那个不一样的值
                one ^= num;
            }
        }
        return new int[]{one,sum^one};
    }
}
